﻿//===============================================================================
// Apolineo Patterns & Practices LeanEngine Framework
//===============================================================================
// Copyright © Apolineo Desenvolvimento de Sistemas Ltda.  All rights reserved.
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE.
//===============================================================================

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using LeanEngine.SalesConcept.Entity;

using LeanEngine.Extensions;
using LeanEngine.Collections;
using LeanEngine.Business;
using LeanEngine.Data.Linq;

namespace LeanEngine.SalesConcept.Business
{
    //Classe de regra de negócio de cliente
    
    //Aqui herdamos da classe BusinessCrud<T> que implementa todo
    //as operações básicas (inserção, atualização, exclusão, leitura)
    internal sealed class BOCustomer : BusinessCrud<Customer>
    {
        #region Singleton Members

        private static BOCustomer _instance = new BOCustomer();

        private BOCustomer() { }

        public static BOCustomer Instance
        {
            get { return _instance; }
        }

        #endregion

        #region ICustomer Members

        public PagedList<Customer> ListCustomers(PersonSearchCriteria criteria)
        {
            //Aqui utilizamos o provedor linq do lob para fazer uma consulta na tabela de clientes
            //buscando por nome e documento
            using (var ctx = new DatabaseContext())
            {
                //Usamos o método de extensão Coalesce para criar um comando do tipo
                //ISNULL(valor, valor_caso_null) para o SQL Server ou NVL(valor, valor_caso_null)
                var customers = from c in ctx.GetTable<Customer>()
                                where c.Name.Contains(criteria.Name.Coalesce(c.Name, string.Empty))
                                    && c.DocumentNumber == criteria.DocumentNumber.Coalesce(c.DocumentNumber, string.Empty)
                                orderby c.Name, c.DocumentNumber
                                select c;

                //O método GetPage executa a consulta paginada e o ToPagedList mapeia do resultado
                //para uma coleção do tipo PagedList<T> (namespace LeanEngine.Collections)
                return customers.GetPage(criteria.PageIndex, criteria.PageSize).ToPagedList();
            }
        }

        #endregion        
    }
}
